<?php
/**
 * @author		João Batista Neto
 * @package		rpo
 * @subpackage	cert
 * @category	OpenSSL, certificates
 * @license		http://opensource.org/licenses/gpl-license.php GNU Public License
 */
namespace rpo\cert;

use \UnexpectedValueException;
use \RuntimeException;
use rpo\base\Object;
use rpo\base\String;
use rpo\cert\interfaces\IOpenSSLCertificate;
use rpo\cert\interfaces\IOpenSSLKey;

/**
 * Implementação da requisição de certificado
 * @author		João Batista Neto
 * @package		rpo
 * @subpackage	cert
 * @category	OpenSSL, certificates
 * @license		http://opensource.org/licenses/gpl-license.php GNU Public License
 */
class OpenSSLCertificate extends Object implements IOpenSSLCertificate {
	/**
	 * @var resource
	 */
	private $resource;

	/**
	 * Constroi um novo objeto de certificado
	 * @param resource $cert Recurso do certificado
	 * @throws UnexpectedValueException Se $cert não for um recurso
	 */
	public function __construct( $cert ){
		if ( is_resource( $cert ) ){
			$this->resource = $cert;
		} else {
			throw new UnexpectedValueException( 'O certificado precisa ser um recurso.' );
		}
	}

	/**
	 * Retorna uma string representando o objeto exportado
	 * @return string
	 * @see IOpenSSLExportable::export()
	 */
	public function export(){
		$ret = null;

		if ( !openssl_x509_export( $this->resource , $ret ) ){
			throw new RuntimeException( openssl_error_string() );
		}

		return $ret;
	}

	/**
	 * Exporta o certificado como um pacote PKCS#12
	 * @param IOpenSSLKey $key
	 * @param String $password A senha do certificado
	 * @return String
	 * @throws RuntimeException Se não for possível exportar o certificado como um pacote PKCS#12
	 */
	public function exportPKCS12( IOpenSSLKey $key , String $password = null ){
		$ret = null;

		if ( !openssl_pkcs12_export( $ths->resource , $ret , $key->getResource() , $password ) ){
			throw new RuntimeException( \openssl_error_string() );
		}

		return new String( $ret );
	}

	/**
	 * Recupera o recurso utilizado pelo objeto
	 * @return resource
	 */
	public function getResource(){
		return $this->resouce;
	}
}